<!DOCTYPE html>
<html lang="zh-cn" itemscope itemtype="http://schema.org/WebPage">
<head>
  <meta charset="utf-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <title> - 友知弄</title>
  

<meta name="renderer" content="webkit" />
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1"/>

<meta name="MobileOptimized" content="width"/>
<meta name="HandheldFriendly" content="true"/>


<meta name="applicable-device" content="pc,mobile">

<meta name="theme-color" content="#f8f5ec" />
<meta name="msapplication-navbutton-color" content="#f8f5ec">
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="#f8f5ec">

<meta name="mobile-web-app-capable" content="yes">

<meta name="author" content="yixy" />
  <meta name="description" content="OS笔记(3)——进程间通信 进程间通信（IPC，Inter Process Communication）的问题和解决方法，同样适用于线程，下面不再单独讨论线程。
但是需要注意的是基于共享变量的通信方式（忙等待、信号量等）通常是应用在线程间通信的（因为进程并不共享地址空间），进程间通信一般使用消息传递机制。
1. IPC面临的问题 IPC需要解决以下三个问题：
 通信：一个进程如何向其它进程传递消息。 互斥：确保多个进程在关键活动中互斥（不会出现交叉执行）。 同步：确保多个进程执行保持一定的顺序（保证某种事件的顺序发生或不发生）。  一些概念：
 竞争条件（race condition）：多个进程读写某些共享数据，而最后的结果取决于进程运行的精确时序，这称为竞争条件。 临界区（critical region/section）：对共享内存进行访问的程序片段被称为临界区。 原子操作：指一组相关联的操作要么都不间断地执行，要么都不执行。  2. 忙等待的互斥 本节讨论几种实现互斥的方案。这些方法本质上是这样的：当一个进程想进入临界区，先检查是否允许进入，若不允许，则该进程将原地等待，直到允许为止。
屏蔽中断
在单处理器系统中，最简单的方法是使每个进程刚刚进入临界区后立即屏蔽所有其它中断，并在离开之前再打开中断。这也做的原因是CPU只有发生时钟中断或其它中断时才会进行进程切换。
严格轮转法
采用软件方式，使进程严格地轮流进入它们的临界区。常用的方式是采用忙等待一直扫描，直到检测到预期的值。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15  //进程0 for{ for turn!=0{ //临界区 } turn=1 } //进程1 for{ for turn!=1{ //临界区 } turn=0 }   Peterson算法
通过将锁和警告变量的思想相结合，提出的一个不需要严格轮转的软件互斥算法。
1 2 3 4 5 6 7 8 9 10  void enter_region(int process){ //进程号，0或1 int other = 1- process //其它进程号 interest[process]=true turn=process for turn==process &amp;amp;&amp;amp; interest[other]==true {} } void leave_region(int process){ interest[process]=false }   TSL或XCHG指令" />

  <meta name="keywords" content="essay, notes" />






<meta name="generator" content="Hugo 0.56.1" />


<link rel="canonical" href="https://yixy.github.io/youzhilane/post/01%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/os%E7%AC%94%E8%AE%B03%E8%BF%9B%E7%A8%8B%E9%97%B4%E9%80%9A%E4%BF%A1/" />



<link rel="icon" href="/youzhilane/favicon.ico" />











<link rel="stylesheet" href="/youzhilane/sass/jane.min.af20b78e95c84de86b00a0242a4a77bd2601700e1b250edf27537d957ac0041d.css" integrity="sha256-ryC3jpXITehrAKAkKkp3vSYBcA4bJQ7fJ1N9lXrABB0=" media="screen" crossorigin="anonymous">





<meta property="og:title" content="" />
<meta property="og:description" content="OS笔记(3)——进程间通信 进程间通信（IPC，Inter Process Communication）的问题和解决方法，同样适用于线程，下面不再单独讨论线程。
但是需要注意的是基于共享变量的通信方式（忙等待、信号量等）通常是应用在线程间通信的（因为进程并不共享地址空间），进程间通信一般使用消息传递机制。
1. IPC面临的问题 IPC需要解决以下三个问题：
 通信：一个进程如何向其它进程传递消息。 互斥：确保多个进程在关键活动中互斥（不会出现交叉执行）。 同步：确保多个进程执行保持一定的顺序（保证某种事件的顺序发生或不发生）。  一些概念：
 竞争条件（race condition）：多个进程读写某些共享数据，而最后的结果取决于进程运行的精确时序，这称为竞争条件。 临界区（critical region/section）：对共享内存进行访问的程序片段被称为临界区。 原子操作：指一组相关联的操作要么都不间断地执行，要么都不执行。  2. 忙等待的互斥 本节讨论几种实现互斥的方案。这些方法本质上是这样的：当一个进程想进入临界区，先检查是否允许进入，若不允许，则该进程将原地等待，直到允许为止。
屏蔽中断
在单处理器系统中，最简单的方法是使每个进程刚刚进入临界区后立即屏蔽所有其它中断，并在离开之前再打开中断。这也做的原因是CPU只有发生时钟中断或其它中断时才会进行进程切换。
严格轮转法
采用软件方式，使进程严格地轮流进入它们的临界区。常用的方式是采用忙等待一直扫描，直到检测到预期的值。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15  //进程0 for{ for turn!=0{ //临界区 } turn=1 } //进程1 for{ for turn!=1{ //临界区 } turn=0 }   Peterson算法
通过将锁和警告变量的思想相结合，提出的一个不需要严格轮转的软件互斥算法。
1 2 3 4 5 6 7 8 9 10  void enter_region(int process){ //进程号，0或1 int other = 1- process //其它进程号 interest[process]=true turn=process for turn==process &amp;&amp; interest[other]==true {} } void leave_region(int process){ interest[process]=false }   TSL或XCHG指令" />
<meta property="og:type" content="article" />
<meta property="og:url" content="https://yixy.github.io/youzhilane/post/01%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/os%E7%AC%94%E8%AE%B03%E8%BF%9B%E7%A8%8B%E9%97%B4%E9%80%9A%E4%BF%A1/" />

<meta itemprop="name" content="">
<meta itemprop="description" content="OS笔记(3)——进程间通信 进程间通信（IPC，Inter Process Communication）的问题和解决方法，同样适用于线程，下面不再单独讨论线程。
但是需要注意的是基于共享变量的通信方式（忙等待、信号量等）通常是应用在线程间通信的（因为进程并不共享地址空间），进程间通信一般使用消息传递机制。
1. IPC面临的问题 IPC需要解决以下三个问题：
 通信：一个进程如何向其它进程传递消息。 互斥：确保多个进程在关键活动中互斥（不会出现交叉执行）。 同步：确保多个进程执行保持一定的顺序（保证某种事件的顺序发生或不发生）。  一些概念：
 竞争条件（race condition）：多个进程读写某些共享数据，而最后的结果取决于进程运行的精确时序，这称为竞争条件。 临界区（critical region/section）：对共享内存进行访问的程序片段被称为临界区。 原子操作：指一组相关联的操作要么都不间断地执行，要么都不执行。  2. 忙等待的互斥 本节讨论几种实现互斥的方案。这些方法本质上是这样的：当一个进程想进入临界区，先检查是否允许进入，若不允许，则该进程将原地等待，直到允许为止。
屏蔽中断
在单处理器系统中，最简单的方法是使每个进程刚刚进入临界区后立即屏蔽所有其它中断，并在离开之前再打开中断。这也做的原因是CPU只有发生时钟中断或其它中断时才会进行进程切换。
严格轮转法
采用软件方式，使进程严格地轮流进入它们的临界区。常用的方式是采用忙等待一直扫描，直到检测到预期的值。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15  //进程0 for{ for turn!=0{ //临界区 } turn=1 } //进程1 for{ for turn!=1{ //临界区 } turn=0 }   Peterson算法
通过将锁和警告变量的思想相结合，提出的一个不需要严格轮转的软件互斥算法。
1 2 3 4 5 6 7 8 9 10  void enter_region(int process){ //进程号，0或1 int other = 1- process //其它进程号 interest[process]=true turn=process for turn==process &amp;&amp; interest[other]==true {} } void leave_region(int process){ interest[process]=false }   TSL或XCHG指令">



<meta itemprop="wordCount" content="157">



<meta itemprop="keywords" content="" />
<meta name="twitter:card" content="summary"/>
<meta name="twitter:title" content=""/>
<meta name="twitter:description" content="OS笔记(3)——进程间通信 进程间通信（IPC，Inter Process Communication）的问题和解决方法，同样适用于线程，下面不再单独讨论线程。
但是需要注意的是基于共享变量的通信方式（忙等待、信号量等）通常是应用在线程间通信的（因为进程并不共享地址空间），进程间通信一般使用消息传递机制。
1. IPC面临的问题 IPC需要解决以下三个问题：
 通信：一个进程如何向其它进程传递消息。 互斥：确保多个进程在关键活动中互斥（不会出现交叉执行）。 同步：确保多个进程执行保持一定的顺序（保证某种事件的顺序发生或不发生）。  一些概念：
 竞争条件（race condition）：多个进程读写某些共享数据，而最后的结果取决于进程运行的精确时序，这称为竞争条件。 临界区（critical region/section）：对共享内存进行访问的程序片段被称为临界区。 原子操作：指一组相关联的操作要么都不间断地执行，要么都不执行。  2. 忙等待的互斥 本节讨论几种实现互斥的方案。这些方法本质上是这样的：当一个进程想进入临界区，先检查是否允许进入，若不允许，则该进程将原地等待，直到允许为止。
屏蔽中断
在单处理器系统中，最简单的方法是使每个进程刚刚进入临界区后立即屏蔽所有其它中断，并在离开之前再打开中断。这也做的原因是CPU只有发生时钟中断或其它中断时才会进行进程切换。
严格轮转法
采用软件方式，使进程严格地轮流进入它们的临界区。常用的方式是采用忙等待一直扫描，直到检测到预期的值。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15  //进程0 for{ for turn!=0{ //临界区 } turn=1 } //进程1 for{ for turn!=1{ //临界区 } turn=0 }   Peterson算法
通过将锁和警告变量的思想相结合，提出的一个不需要严格轮转的软件互斥算法。
1 2 3 4 5 6 7 8 9 10  void enter_region(int process){ //进程号，0或1 int other = 1- process //其它进程号 interest[process]=true turn=process for turn==process &amp;&amp; interest[other]==true {} } void leave_region(int process){ interest[process]=false }   TSL或XCHG指令"/>

<!--[if lte IE 9]>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/classlist/1.1.20170427/classList.min.js"></script>
<![endif]-->

<!--[if lt IE 9]>
  <script src="https://cdn.jsdelivr.net/npm/html5shiv@3.7.3/dist/html5shiv.min.js"></script>
  <script src="https://cdn.jsdelivr.net/npm/respond.js@1.4.2/dest/respond.min.js"></script>
<![endif]-->




</head>
<body>
  <div id="mobile-navbar" class="mobile-navbar">
  <div class="mobile-header-logo">
    <a href="/youzhilane/" class="logo">友知弄</a>
  </div>
  <div class="mobile-navbar-icon">
    <span></span>
    <span></span>
    <span></span>
  </div>
</div>
<nav id="mobile-menu" class="mobile-menu slideout-menu">
  <ul class="mobile-menu-list">
    <li class="mobile-menu-item">
        
          
          
            <a class="menu-item-link" href="https://yixy.github.io/youzhilane/">主页</a>
          
        
      </li><li class="mobile-menu-item">
        
          
          
            <a class="menu-item-link" href="https://yixy.github.io/youzhilane/categories/">分类</a>
          
        
      </li><li class="mobile-menu-item">
        
          
          
            <a class="menu-item-link" href="https://yixy.github.io/youzhilane/booklist/">书单</a>
          
        
      </li><li class="mobile-menu-item">
        
          
          
            <a class="menu-item-link" href="https://yixy.github.io/youzhilane/about/">关于友知弄</a>
          
        
      </li><li class="mobile-menu-item">
        
          
          
            <a class="menu-item-link" href="https://github.com/yixy" rel="noopener" target="_blank">
              GitHub
              
              <i class="iconfont">
                <svg class="icon" viewBox="0 0 1024 1024" version="1.1"
  xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
  width="18" height="18">
  <path d="M623.36 272.96 473.216 423.04C467.2 429.056 467.072 438.656 472.896 444.416c0 0-6.72-6.656 1.6 1.6C496.064 467.648 528.64 500.224 528.64 500.224 534.464 506.048 544 505.856 550.016 499.904l150.08-150.144 67.328 66.432c9.024 8.96 27.456 4.544 30.4-8.96 19.968-92.608 46.656-227.52 46.656-227.52 6.848-34.496-16.192-56.704-49.92-49.92 0 0-134.656 26.816-227.328 46.784C560.32 178.048 556.352 182.272 554.752 187.136c-3.2 6.208-3.008 14.208 3.776 20.992L623.36 272.96z"></path>
  <path d="M841.152 457.152c-30.528 0-54.784 24.512-54.784 54.656l0 274.752L237.696 786.56 237.696 237.696l206.016 0c6.656 0 10.752 0 13.248 0C487.68 237.696 512 213.184 512 182.848 512 152.32 487.36 128 456.96 128L183.04 128C153.216 128 128 152.576 128 182.848c0 3.136 0.256 6.272 0.768 9.28C128.256 195.136 128 198.272 128 201.408l0 639.488c0 0.064 0 0.192 0 0.256 0 0.128 0 0.192 0 0.32 0 30.528 24.512 54.784 54.784 54.784l646.976 0c6.592 0 9.728 0 11.712 0 28.736 0 52.928-22.976 54.464-51.968C896 843.264 896 842.304 896 841.344l0-20.352L896 561.408 896 512.128C896 481.792 871.424 457.152 841.152 457.152z"></path>
</svg>

              </i>
            </a>
          
        
      </li><li class="mobile-menu-item">
        
          
          <div class="mobile-menu-parent">
            <span class="mobile-submenu-open"></span>
            <a href="https://yixy.github.io/youzhilane/post/">
              归档
            </a>
          </div>
          <ul class="mobile-submenu-list">
            
              <li>
                <a href="https://yixy.github.io/youzhilane/post/">日期</a>
              </li>
            
              <li>
                <a href="https://yixy.github.io/youzhilane/tags/">标签</a>
              </li>
            
          </ul>
        
      </li>
    

    
  </ul>
</nav>


  
    






  <link rel="stylesheet" href="/youzhilane/lib/photoswipe/photoswipe.min.css" />
  <link rel="stylesheet" href="/youzhilane/lib/photoswipe/default-skin/default-skin.min.css" />




<div class="pswp" tabindex="-1" role="dialog" aria-hidden="true">

<div class="pswp__bg"></div>

<div class="pswp__scroll-wrap">
    
    <div class="pswp__container">
      <div class="pswp__item"></div>
      <div class="pswp__item"></div>
      <div class="pswp__item"></div>
    </div>
    
    <div class="pswp__ui pswp__ui--hidden">
    <div class="pswp__top-bar">
      
      <div class="pswp__counter"></div>
      <button class="pswp__button pswp__button--close" title="Close (Esc)"></button>
      <button class="pswp__button pswp__button--share" title="Share"></button>
      <button class="pswp__button pswp__button--fs" title="Toggle fullscreen"></button>
      <button class="pswp__button pswp__button--zoom" title="Zoom in/out"></button>
      
      
      <div class="pswp__preloader">
        <div class="pswp__preloader__icn">
          <div class="pswp__preloader__cut">
            <div class="pswp__preloader__donut"></div>
          </div>
        </div>
      </div>
    </div>
    <div class="pswp__share-modal pswp__share-modal--hidden pswp__single-tap">
      <div class="pswp__share-tooltip"></div>
    </div>
    <button class="pswp__button pswp__button--arrow--left" title="Previous (arrow left)">
    </button>
    <button class="pswp__button pswp__button--arrow--right" title="Next (arrow right)">
    </button>
    <div class="pswp__caption">
      <div class="pswp__caption__center"></div>
    </div>
    </div>
    </div>
</div>

  

  

  

  <header id="header" class="header container">
    <div class="logo-wrapper">
  <a href="/youzhilane/" class="logo">
    
      友知弄
    
  </a>
</div>

<nav class="site-navbar">
  <ul id="menu" class="menu">
    
    
        <li class="menu-item">
        
          
          
            <a class="menu-item-link" href="https://yixy.github.io/youzhilane/">主页</a>
          

        

      </li>
    
        <li class="menu-item">
        
          
          
            <a class="menu-item-link" href="https://yixy.github.io/youzhilane/categories/">分类</a>
          

        

      </li>
    
        <li class="menu-item">
        
          
          
            <a class="menu-item-link" href="https://yixy.github.io/youzhilane/booklist/">书单</a>
          

        

      </li>
    
        <li class="menu-item">
        
          
          
            <a class="menu-item-link" href="https://yixy.github.io/youzhilane/about/">关于友知弄</a>
          

        

      </li>
    
        <li class="menu-item">
        
          
          
            <a class="menu-item-link" href="https://github.com/yixy" rel="noopener" target="_blank">
              GitHub
              
              <i class="iconfont">
                <svg class="icon" viewBox="0 0 1024 1024" version="1.1"
  xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
  width="18" height="18">
  <path d="M623.36 272.96 473.216 423.04C467.2 429.056 467.072 438.656 472.896 444.416c0 0-6.72-6.656 1.6 1.6C496.064 467.648 528.64 500.224 528.64 500.224 534.464 506.048 544 505.856 550.016 499.904l150.08-150.144 67.328 66.432c9.024 8.96 27.456 4.544 30.4-8.96 19.968-92.608 46.656-227.52 46.656-227.52 6.848-34.496-16.192-56.704-49.92-49.92 0 0-134.656 26.816-227.328 46.784C560.32 178.048 556.352 182.272 554.752 187.136c-3.2 6.208-3.008 14.208 3.776 20.992L623.36 272.96z"></path>
  <path d="M841.152 457.152c-30.528 0-54.784 24.512-54.784 54.656l0 274.752L237.696 786.56 237.696 237.696l206.016 0c6.656 0 10.752 0 13.248 0C487.68 237.696 512 213.184 512 182.848 512 152.32 487.36 128 456.96 128L183.04 128C153.216 128 128 152.576 128 182.848c0 3.136 0.256 6.272 0.768 9.28C128.256 195.136 128 198.272 128 201.408l0 639.488c0 0.064 0 0.192 0 0.256 0 0.128 0 0.192 0 0.32 0 30.528 24.512 54.784 54.784 54.784l646.976 0c6.592 0 9.728 0 11.712 0 28.736 0 52.928-22.976 54.464-51.968C896 843.264 896 842.304 896 841.344l0-20.352L896 561.408 896 512.128C896 481.792 871.424 457.152 841.152 457.152z"></path>
</svg>

              </i>
            </a>
          

        

      </li>
    
        <li class="menu-item">
        
          
          <a class="menu-item-link menu-parent" href="https://yixy.github.io/youzhilane/post/">归档</a>
          <ul class="submenu">
            
              <li>
                <a href="https://yixy.github.io/youzhilane/post/">日期</a>
              </li>
            
              <li>
                <a href="https://yixy.github.io/youzhilane/tags/">标签</a>
              </li>
            
          </ul>

        

      </li>
    

    
    

    
  </ul>
</nav>

  </header>

  <div id="mobile-panel">
    <main id="main" class="main bg-llight">
      <div class="content-wrapper">
        <div id="content" class="content container">
          <article class="post bg-white">
    
    <header class="post-header">
      <h1 class="post-title"></h1>
      
      <div class="post-meta">
        <time datetime="0001-01-01" class="post-time">
          0001-01-01
        </time>
        
        <span class="more-meta"> 约 157 字 </span>
          <span class="more-meta"> 预计阅读 1 分钟 </span>

        
        

        
        
      </div>
    </header>

    
    
<div class="post-toc" id="post-toc">
  <h2 class="post-toc-title">文章目录</h2>
  <div class="post-toc-content">
    <nav id="TableOfContents">
<ul>
<li><a href="#os笔记-3-进程间通信">OS笔记(3)——进程间通信</a>
<ul>
<li><a href="#1-ipc面临的问题">1. IPC面临的问题</a></li>
<li><a href="#2-忙等待的互斥">2. 忙等待的互斥</a></li>
<li><a href="#3-信号量">3. 信号量</a></li>
<li><a href="#4-管程">4. 管程</a></li>
<li><a href="#5-消息传递">5. 消息传递</a></li>
<li><a href="#6-屏障-进程组的同步机制">6. 屏障：进程组的同步机制</a></li>
<li><a href="#7-参考">7. 参考</a></li>
</ul></li>
</ul>
</nav>
  </div>
</div>

    
    <div class="post-content">
      

<h1 id="os笔记-3-进程间通信">OS笔记(3)——进程间通信</h1>

<p>进程间通信（IPC，Inter Process Communication）的问题和解决方法，同样适用于线程，下面不再单独讨论线程。</p>

<p><strong><em>但是需要注意的是基于共享变量的通信方式（忙等待、信号量等）通常是应用在线程间通信的（因为进程并不共享地址空间），进程间通信一般使用消息传递机制。</em></strong></p>

<h2 id="1-ipc面临的问题">1. IPC面临的问题</h2>

<p>IPC需要解决以下三个问题：</p>

<ul>
<li>通信：一个进程如何向其它进程传递消息。</li>
<li>互斥：确保多个进程在关键活动中互斥（不会出现交叉执行）。</li>
<li>同步：确保多个进程执行保持一定的顺序（保证某种事件的顺序发生或不发生）。</li>
</ul>

<p>一些概念：</p>

<ul>
<li>竞争条件（race condition）：多个进程读写某些共享数据，而最后的结果取决于进程运行的精确时序，这称为竞争条件。</li>
<li>临界区（critical region/section）：对共享内存进行访问的程序片段被称为临界区。</li>
<li>原子操作：指一组相关联的操作要么都不间断地执行，要么都不执行。</li>
</ul>

<h2 id="2-忙等待的互斥">2. 忙等待的互斥</h2>

<p>本节讨论几种实现互斥的方案。这些方法本质上是这样的：当一个进程想进入临界区，先检查是否允许进入，若不允许，则该进程将原地等待，直到允许为止。</p>

<p><strong>屏蔽中断</strong></p>

<p>在单处理器系统中，最简单的方法是使每个进程刚刚进入临界区后立即屏蔽所有其它中断，并在离开之前再打开中断。这也做的原因是CPU只有发生时钟中断或其它中断时才会进行进程切换。</p>

<p><strong>严格轮转法</strong></p>

<p>采用软件方式，使进程严格地轮流进入它们的临界区。常用的方式是采用忙等待一直扫描，直到检测到预期的值。</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre class="chroma"><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span></pre></td>
<td class="lntd">
<pre class="chroma">//进程0
for{
  for turn!=0{
    //临界区
  }
  turn=1
}

//进程1
for{
  for turn!=1{
    //临界区
  }
  turn=0
}</pre></td></tr></table>
</div>
</div>
<p><strong>Peterson算法</strong></p>

<p>通过将锁和警告变量的思想相结合，提出的一个不需要严格轮转的软件互斥算法。</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre class="chroma"><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span></pre></td>
<td class="lntd">
<pre class="chroma">void enter_region(int process){ //进程号，0或1
  int other = 1- process //其它进程号
  interest[process]=true
  turn=process
  for turn==process &amp;&amp; interest[other]==true {}
}

void leave_region(int process){
  interest[process]=false
}</pre></td></tr></table>
</div>
</div>
<p><strong>TSL或XCHG指令</strong></p>

<p>通过类似原子指令写锁变量实现互斥。这些指令的原子操作是由锁住存储总线保证的，所以对多处理器也能很好的工作。</p>

<h2 id="3-信号量">3. 信号量</h2>

<p>忙等待会浪费CPU时间，另外，容易引起死锁（例如优先级反转问题）。可以使用信号量机制，让进程在无法进入临界区时阻塞，而不是忙等待。</p>

<ul>
<li>信号量：一个整型变量，取值可以为0或正整数。</li>
<li>信号量的down操作：检查信号量的值是否大于0，若大于0则将其值减1；若值为0，则进程进入阻塞状态，此时down操作未完成。注意，检查数值，修改数值（或发生的阻塞）均为不可分割的原子操作。</li>
<li>信号量的up操作：使信号量的值加1，唤醒一个阻塞在down操作的进程（如果存在的话），并允许该进程完成其down操作。注意，信号量的增1和唤醒一个进程同样是不可分割的原子操作。</li>
</ul>

<p>通常，信号量操作中的原子性也通过屏蔽中断实现。</p>

<p><strong>利用信号量实现互斥</strong></p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre class="chroma"><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span></pre></td>
<td class="lntd">
<pre class="chroma">s=1//初始化信号量
P1(){
  P(s)
  //临界区
  V(s)
}
P2(){
  P(s)
  //临界区
  V(s)
}</pre></td></tr></table>
</div>
</div>
<p><strong>利用信号量实现同步</strong></p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre class="chroma"><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span></pre></td>
<td class="lntd">
<pre class="chroma">//先执行x，后执行y
s=0//初始化信号量
P1(){
  x
  V(s)
}
P2(){
  P(s)
  y
}</pre></td></tr></table>
</div>
</div>
<h2 id="4-管程">4. 管程</h2>

<p>使用信号量进行编程较为麻烦，一处很小的编码错误可能导致很严重的问题。为了更易于编写更正确的程序，很多编程语言提出了管程的概念。</p>

<ul>
<li>管程（monitor）：管程是一个编程语言概念，编译器必须识别管程并用某种方式对其互斥做出安排。一个管程是一个由过程、变量、数据结构等组成的一个集合，它们组成一个特殊的模块或软件包。任一时刻，管程中只能有一个活跃进程。通过临界区互斥的自动化，管程比信号量更容易保证并行编程的正确性。</li>
</ul>

<h2 id="5-消息传递">5. 消息传递</h2>

<p>忙等待和信号量机制实际上是借助了共享变量实现的。多个线程访问一个信号量是没问题的，但是对于进程来说就不是这样了。通常可以采用两个方式解决这个问题，要么将信号量放入内核，要么使用操作系统提供的进程共享空间机制（例如管道），如果操作系统不提供类似机制，则还可以自行使用文件进行。</p>

<p>实际上，进程间通信通常只采用消息传递的方式，例如使用TCP通信。</p>

<h2 id="6-屏障-进程组的同步机制">6. 屏障：进程组的同步机制</h2>

<p>在有些应用中划分了若干阶段，并且规定，除非所有进程都就绪准备着手下一阶段，否则任何进程都不能进入下一个阶段。可以在每个阶段的结尾安置屏障（barrier）来实现这种行为。当一个进程到达屏障时，它就被屏障阻拦，直到所有进程都到达该屏障为止。</p>

<h2 id="7-参考">7. 参考</h2>

<p>《现代操作系统》，Tanenbaum</p>

    </div>

    
    
<div class="post-copyright">
  <p class="copyright-item">
    <span class="item-title">文章作者</span>
    <span class="item-content">yixy</span>
  </p>
  <p class="copyright-item">
    <span class="item-title">上次更新</span>
    <span class="item-content">
      0001-01-01
      
    </span>
  </p>
  
  <p class="copyright-item">
    <span class="item-title">许可协议</span>
    <span class="item-content"><a rel="license noopener" href="https://creativecommons.org/licenses/by-nc-nd/4.0/" target="_blank">CC BY-NC-ND 4.0</a></span>
  </p>
</div>


    
    
<div class="post-reward">
  <input type="checkbox" name="reward" id="reward" hidden />
  <label class="reward-button" for="reward">赞赏支持</label>
  <div class="qr-code">
    
    
      <label class="qr-code-image" for="reward">
        <img class="image" src="/youzhilane/img/about/wechat.jpg">
        <span>微信打赏</span>
      </label>
    
  </div>
</div>

    <footer class="post-footer">
      

      
      <nav class="post-nav">
        
          <a class="prev" href="/youzhilane/post/01%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/os%E7%AC%94%E8%AE%B02%E8%BF%9B%E7%A8%8B%E4%B8%8E%E7%BA%BF%E7%A8%8B/">
            
            <i class="iconfont">
              <svg  class="icon" viewBox="0 0 1024 1024" version="1.1"
  xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
  width="18" height="18">
  <path d="M691.908486 949.511495l75.369571-89.491197c10.963703-12.998035 10.285251-32.864502-1.499144-44.378743L479.499795 515.267417 757.434875 204.940602c11.338233-12.190647 11.035334-32.285311-0.638543-44.850487l-80.46666-86.564541c-11.680017-12.583596-30.356378-12.893658-41.662889-0.716314L257.233596 494.235404c-11.332093 12.183484-11.041474 32.266891 0.657986 44.844348l80.46666 86.564541c1.772366 1.910513 3.706415 3.533476 5.750981 4.877077l306.620399 321.703933C662.505829 963.726242 680.945807 962.528973 691.908486 949.511495z"></path>
</svg>

            </i>
            <span class="prev-text nav-default"></span>
            <span class="prev-text nav-mobile">上一篇</span>
          </a>
        
          <a class="next" href="/youzhilane/post/01%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/os%E7%AC%94%E8%AE%B04%E8%BF%9B%E7%A8%8B%E8%B0%83%E5%BA%A6%E7%AE%97%E6%B3%95/">
            <span class="next-text nav-default"></span>
            <span class="prev-text nav-mobile">下一篇</span>
            
            <i class="iconfont">
              <svg class="icon" viewBox="0 0 1024 1024" version="1.1"
  xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
  width="18" height="18">
  <path d="M332.091514 74.487481l-75.369571 89.491197c-10.963703 12.998035-10.285251 32.864502 1.499144 44.378743l286.278095 300.375162L266.565125 819.058374c-11.338233 12.190647-11.035334 32.285311 0.638543 44.850487l80.46666 86.564541c11.680017 12.583596 30.356378 12.893658 41.662889 0.716314l377.434212-421.426145c11.332093-12.183484 11.041474-32.266891-0.657986-44.844348l-80.46666-86.564541c-1.772366-1.910513-3.706415-3.533476-5.750981-4.877077L373.270379 71.774697C361.493148 60.273758 343.054193 61.470003 332.091514 74.487481z"></path>
</svg>

            </i>
          </a>
      </nav>
    </footer>
  </article>

  
  
  
  

  
  

  

  
  

  

  

  

    

  

        </div>
      </div>
    </main>

    <footer id="footer" class="footer">
      <div class="icon-links">
  
  
    <a href="mailto:youzhilane01@gmail.com" rel="me noopener" class="iconfont"
      title="email" >
      <svg class="icon" viewBox="0 0 1451 1024" version="1.1"
  xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
  width="36" height="36">
  <path d="M664.781909 681.472759 0 97.881301C0 3.997201 71.046997 0 71.046997 0L474.477909 0 961.649408 0 1361.641813 0C1361.641813 0 1432.688811 3.997201 1432.688811 97.881301L771.345323 681.472759C771.345323 681.472759 764.482731 685.154773 753.594283 688.65053L753.594283 688.664858C741.602731 693.493018 729.424896 695.068979 718.077952 694.839748 706.731093 695.068979 694.553173 693.493018 682.561621 688.664858L682.561621 688.65053C671.644501 685.140446 664.781909 681.472759 664.781909 681.472759L664.781909 681.472759ZM718.063616 811.603883C693.779541 811.016482 658.879232 802.205449 619.10784 767.734955 542.989056 701.759633 0 212.052267 0 212.052267L0 942.809523C0 942.809523 0 1024 83.726336 1024L682.532949 1024 753.579947 1024 1348.948139 1024C1432.688811 1024 1432.688811 942.809523 1432.688811 942.809523L1432.688811 212.052267C1432.688811 212.052267 893.138176 701.759633 817.019477 767.734955 777.248 802.205449 742.347691 811.03081 718.063616 811.603883L718.063616 811.603883Z"></path>
</svg>

    </a>


<a href="https://yixy.github.io/youzhilane/index.xml" rel="noopener alternate" type="application/rss&#43;xml"
    class="iconfont" title="rss" target="_blank">
    <svg class="icon" viewBox="0 0 1024 1024" version="1.1"
  xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
  width="30" height="30">
  <path d="M819.157333 1024C819.157333 574.592 449.408 204.8 0 204.8V0c561.706667 0 1024 462.293333 1024 1024h-204.842667zM140.416 743.04a140.8 140.8 0 0 1 140.501333 140.586667A140.928 140.928 0 0 1 140.074667 1024C62.72 1024 0 961.109333 0 883.626667s62.933333-140.544 140.416-140.586667zM678.784 1024h-199.04c0-263.210667-216.533333-479.786667-479.744-479.786667V345.173333c372.352 0 678.784 306.517333 678.784 678.826667z"></path>
</svg>

  </a>
   
</div>

<div class="copyright">
  <span class="power-by">
    Powered by <a class="hexo-link" href="https://gohugo.io">Hugo</a>
  </span>
  <span class="division">|</span>
  <span class="theme-info">
    Theme - <a class="theme-link" href="https://github.com/xianmin/hugo-theme-jane">Jane</a>
  </span>

  <span class="copyright-year">
    &copy;
    2019
    <span class="heart">
      
      <i class="iconfont">
        <svg class="icon" viewBox="0 0 1025 1024" version="1.1"
  xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
  width="14" height="14">
  <path d="M1000.1 247.9c-15.5-37.3-37.6-70.6-65.7-98.9-54.4-54.8-125.8-85-201-85-85.7 0-166 39-221.4 107.4C456.6 103 376.3 64 290.6 64c-75.1 0-146.5 30.4-201.1 85.6-28.2 28.5-50.4 61.9-65.8 99.3-16 38.8-24 79.9-23.6 122.2 0.7 91.7 40.1 177.2 108.1 234.8 3.1 2.6 6 5.1 8.9 7.8 14.9 13.4 58 52.8 112.6 102.7 93.5 85.5 209.9 191.9 257.5 234.2 7 6.1 15.8 9.5 24.9 9.5 9.2 0 18.1-3.4 24.9-9.5 34.5-30.7 105.8-95.9 181.4-165 74.2-67.8 150.9-138 195.8-178.2 69.5-57.9 109.6-144.4 109.9-237.3 0.1-42.5-8-83.6-24-122.2z"
   fill="#8a8a8a"></path>
</svg>

      </i>
    </span><span class="author">
        yixy
        
      </span></span>

  
  

  
</div>

    </footer>

    <div class="back-to-top" id="back-to-top">
      <i class="iconfont">
        
        <svg class="icon" viewBox="0 0 1024 1024" version="1.1"
  xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
  width="35" height="35">
  <path d="M510.866688 227.694839 95.449397 629.218702l235.761562 0-2.057869 328.796468 362.40389 0L691.55698 628.188232l241.942331-3.089361L510.866688 227.694839zM63.840492 63.962777l894.052392 0 0 131.813095L63.840492 195.775872 63.840492 63.962777 63.840492 63.962777zM63.840492 63.962777"></path>
</svg>

      </i>
    </div>
  </div>
  
<script type="text/javascript" src="/youzhilane/lib/jquery/jquery-3.2.1.min.js"></script>
  <script type="text/javascript" src="/youzhilane/lib/slideout/slideout-1.0.1.min.js"></script>




<script type="text/javascript" src="/youzhilane/js/main.638251f4230630f0335d8c6748e53a96f94b72670920b60c09a56fdc8bece214.js" integrity="sha256-Y4JR9CMGMPAzXYxnSOU6lvlLcmcJILYMCaVv3Ivs4hQ=" crossorigin="anonymous"></script>












  
    <script type="text/javascript" src="/youzhilane/js/load-photoswipe.js"></script>
    <script type="text/javascript" src="/youzhilane/lib/photoswipe/photoswipe.min.js"></script>
    <script type="text/javascript" src="/youzhilane/lib/photoswipe/photoswipe-ui-default.min.js"></script>
  















</body>
</html>
